package org.example.ShejiModel.Proxy.CGLibTDProxy;



import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

public class ProxyFactory implements MethodInterceptor {

    private TrainStation trainStation = new TrainStation();
    public TrainStation getProxyObject(){
        //创建Enhancer对象,类似与JDK代理中的proxy类
        Enhancer enhancer = new Enhancer();
        //设置父类的字节码对象
        enhancer.setSuperclass(TrainStation.class);
        //设置回调函数 MethodInterceptor子实现类也就是 本类this
        enhancer.setCallback(this);
        //创建代理对象
        TrainStation proxyObject = (TrainStation) enhancer.create();
        return  proxyObject;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("代售点收取服务费...");
        //要调用目标对象的方法
        /**
         * Object proxy :代理对象,和proxyObject是同一个对象，在invoke中基本不用
         * Method method : 对接口中的方法 (sell()方法) 进行封装的method对象
         * Object[] args : 调用方法 (sell()方法) 的实际参数, 本例中sell()方法无参数
         *
         *返回值 就是sell()方法的返回值 ,由于sell()方法没有返回值 因此就是返回null
         */
        Object obj = method.invoke(trainStation,objects);
        return obj;
    }
}
